home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 31
/
Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso
/
Aminet
/
dev
/
c
/
GED_Scripts.lha
/
GED_Scripts
/
NewAutodoc.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-02-24
|
4KB
|
171 lines
/* -----------------------------------------------------------------------------
Scan handler looking for Autodoc nodes. This handler simply looks for
formfeeds and therefore won't work with all Autodocs (Commodore's Autodocs
are handled properly).
Scan handlers are plain functions (loadSeg()'ed): no standard C startup
code and no library calls permitted. We have to put string constants into
the code segment (DICE compiler: option -ms1).
DICE:
dcc autodocslow.c -// -l0 -md -mRR -o golded:etc/scanner/autodocslow
------------------------------------------------------------------------------
*/
#include <exec/types.h>
#define REG(x) register __##x
#define FORMFEED 12
ULONG ScanHandlerGuide(REG(d0) ULONG len, REG(a0) char **text, REG(a1) ULONG *line)
{
const char version[] = "$VER: NewADoc 1.1 (24.02.99)";
static UBYTE buffer[255];
static ULONG inbuffer;
UBYTE *next;
ULONG length;
// buffer length for later use
length = len;
// clear "last result" buffer if we start parsing a new document
if (line == 0)
*buffer = 0;
if (**text == FORMFEED) {
// look for beginning of header string (e.g. "Dos.Library/Open")
while (len && (**text <= ' ')) {
++*text;
--len;
}
// ignore first part of header string
while (len && (**text != '/')) {
++*text;
len--;
}
// extract node name
if (len) {
ULONG letters;
++*text;
--len;
for (letters = 0; len && ((*text)[letters] >= '.'); --len)
++letters;
if (letters)
{
// buffer result
buffer[letters] = 0;
len = letters;
while (len--)
buffer[len] = (*text)[len];
inbuffer = letters;
return(letters);
}
else
return FALSE;
}
}
// did one of the previous lines produce a result ?
if (*buffer) {
next = *text;
// look for "alternative version" mentioned in the text
while (length) {
// skip white space
while (length && (*next < 'A')) {
--length;
++next;
}
// check next word
if (length) {
ULONG keylen;
// set (possible) result string
*text = next;
// determine length of next word
for (keylen = 0; length && (*next >= 'A'); ++next) {
++keylen;
--length;
}
// close match found ?
if (**text == *buffer) {
// only last letter may differ; eg. DrawBevelBox vs. DrawBevelBoxA
if ((keylen == (inbuffer + 1)) || (keylen == (inbuffer - 1))) {
ULONG compare = (keylen < inbuffer) ? keylen : inbuffer;
// does one of both end with 'A'?
if ((*text)[compare] != 'A' && buffer[compare] != 'A')
return FALSE;
while (compare--) {
if ((*text)[compare] != buffer[compare])
break;
else if (compare == 0) {
// stop searching for alternative versions
*buffer = 0;
// return result
return(keylen);
}
}
}
}
}
}
}
return(FALSE);
}